#include "delay.h"

static uint8_t  fac_us = 0; //us延时倍乘数
static uint16_t fac_ms = 0; //ms延时倍乘数

/***********************************************
函数名：delay_init(uint8_t SYSCLK)
功能：初始化延时函数
输入参数：SYSCLK
输出:无
描述：由于该延时是由定时器中断计数完成的，所以需要对相应的寄存器和时钟赋值
备注：输出参数为系统时钟
***********************************************/
void delay_init(uint8_t SYSCLK)
{
    SysTick->CTRL &= 0xfffffffb; //bit2清空,选择外部时钟  HCLK/8
    fac_us = SYSCLK / 8;
    fac_ms = (uint16_t)fac_us * 1000;
}


/**************************实现函数********************************************
*函数原型:      void delay_ms(uint16_t nms)
*功　　能:      毫秒级延时  延时nms  nms<=1864
*******************************************************************************/
void delay_ms(uint16_t nms)
{
    uint32_t temp;
    SysTick->LOAD = (uint32_t)nms * fac_ms; //时间加载(SysTick->LOAD为24bit)
    SysTick->VAL = 0x00;          //清空计数器
    SysTick->CTRL = 0x01;        //开始倒数
    do
    {
        temp = SysTick->CTRL;
    } while (temp & 0x01 && !(temp & (1 << 16))); //等待时间到达
    SysTick->CTRL = 0x00;     //关闭计数器
    SysTick->VAL = 0X00;      //清空计数器
}


/**************************实现函数********************************************
*函数原型:      void delay_us(uint32_t nus)
*功　　能:      微秒级延时  延时nus  nms<=1864
*******************************************************************************/
void delay_us(uint32_t nus)
{
    uint32_t temp;
    SysTick->LOAD = nus * fac_us; //时间加载
    SysTick->VAL = 0x00;      //清空计数器
    SysTick->CTRL = 0x01;    //开始倒数
    do
    {
        temp = SysTick->CTRL;
    } while (temp & 0x01 && !(temp & (1 << 16))); //等待时间到达
    SysTick->CTRL = 0x00;     //关闭计数器
    SysTick->VAL = 0X00;      //清空计数器
}


//粗略延时
void Delay(unsigned long delay_time)
{
    long i;

    for (i = 0; i < delay_time; i++);

}


